//第一步:引入插件
import VueRouter from "vue-router";
//第二步：引入Vue
import Vue from "vue";
//第三步：使用插件
Vue.use(VueRouter);

import routes from '@/router/routes'
import store from "@/store";

//注意:虽然是重写push|replace方法,最终实现路由跳转与传递参数，起始还是用人家原来的push方法

//先把人家原有备份一份--原始push
let originPush = VueRouter.prototype.push;

//备份原始replace
let originReplace = VueRouter.prototype.replace;

//重写push方法
VueRouter.prototype.push = function (location, resolve, reject) {
  //面试题:call与apply区别?
  //相同点:都可以让当前函数执行一次
  //不同点：call传递参数用逗号隔开，apply，传递参数数组
  //call第一个参数:this
  if (resolve && reject) {
    originPush.call(this, location, resolve, reject);
  } else {
    originPush.call(this, location, () => { }, () => { });
  }
}

//重写replace方法
VueRouter.prototype.replace = function (location, resolve, reject) {
  //判断
  if (resolve && reject) {
    originReplace.call(this, location, resolve, reject);
  } else {
    originReplace.call(this, location, () => { }, () => { });
  }
}


//箭头函数
const withRouter = () => {
  return new VueRouter({
    //一个路由器:管理多个路由
    routes,
    //滚动行为:当路由进行切换跳转的时候，可以设置滚动条的位置
    scrollBehavior() {
      //这里可以设置x轴，目前咱们项目没有x轴
      return { y: 0 };
    }
  })
}
const router = withRouter();

//全局守卫  用户跳转那个页面 守卫都需要查看下

//全局前置守卫
router.beforeEach(async (to, from, next) => {
  //to  跳转到那个路由的路由对象
  //from  从那个路由来的 那个路由的对象
  //next  不是路由对象  是一个函数  放行函数  跳转到那个路由对象
  //判断路由是否登录   登录一定带有token
  let hasToken = store.state.user.hsaToken
  //不能通过空对象判断  空对象也等于有   要通过对象的属性有没有判断
  let hasUserInfo = store.state.user.userInfo.loginName
  //用户登录
  if (hasToken) {
    //用户登陆了 还想去登录页   直接跳到home主页
    if (to.path == '/login') {
      next('/home')
    } else {
      //用户登陆了,但是去的并非login
      if (hasUserInfo) {
        //用户登录了   去的不是login  只要有用户信息 就放行 随便跳转
        next();
      } else {
        try {
          //用户登陆了  去的并非login 但是没有获取到用户信息, 发请求 获取用户信息
          await store.dispatch('getUserInfo')
          //获取到了用户信息就放行
          next()
        }catch(error){
          //用户登录了  但是没有用户信息 获取请求也失败  就是说 token 过期了 需要用户重新登录
          //清除过期的用户信息相关内容  本地存储也清空
          await store.dispatch('logout')
          //返回登录页面
          next('/login');
        }
      }
    }
  }else{
    //用户未登录
    next();
  }
})
//第四步：暴露VueRouter类的实例
export default router;